<?php

	require_once CORMO_DIR_CORE.'Object.class.php';
	
	/**
	 * Generador de los Objetos Base<Object> a partir de lo definido en Schema.php.
	 * Escribe la Class para cada Objeto de Schema. 
	 *
   * @category cormo
   * @package Generator
   * @author Germán Dario Peraferrer <gperaferrer@gmail.com>
   * @copyright Copyright (c) 2007 Germán Dario Peraferrer - Beetec
   * @version 1.0 Beta
   * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
   * @link http://code.google.com/p/cormoframework/
   * @link http://www.beetec.com.ar
	 */
	
	class BaseObject extends Object {

		/**
		 * Array con los property que representan Objetos de relacion 1:1
		 *
		 * @var array
		 */
		private $arrSetObjects;
		
		function __construct($NameObjectORM) {
			parent::__construct($NameObjectORM);
			
      $arrSetObjects = array();
      $arrTable = array();
      $arrField = array();
    	
      // Buscamos los objetos que estan relacionados 1:1 para poder definir el metodo ADD
			foreach($this->getConfigTableAssociate() as $table => $field)	{
				if (($field != '1:n') && ($field != 'n:n'))	{
					array_push($arrTable, $table);
					array_push($arrField, $field);
				}
			}
				
			// Array con los Objetos que poseen Relacion 1:1
			$this->setSetObjects(@array_combine($arrTable, $arrField));
				
		}
		
		function __toString() {
			$retun = "";
			
			/**
			 * Definimos lo Require de la Class
			 */
			
      $retun .=	'  require_once CORMO_DIR_CORE."Persist.class.php";'."\n";
      $retun .=	'  require_once CORMO_DIR_CORE."Persist.interface.class.php";'."\n\n";
						
			/**
			 * Definimos la Class
			 */
			$retun .= '  /**'."\n";
			$retun .= '   * Class generada autom�ticamente cormo.'."\n";
			$retun .= '   * '."\n";
			$retun .= '   * @category cormo'."\n";
			$retun .= '   * @package Base'."\n";
			$retun .= '   * @author Germán Dario Peraferrer <gperaferrer@gmail.com>'."\n";
			$retun .= '   * @copyright Copyright (c) 2007 Germán Dario Peraferrer - Beetec'."\n";
			$retun .= '   * @version 1.0 Beta'."\n";
			$retun .= '   * @license http://www.opensource.org/licenses/bsd-license.php New BSD License'."\n";
			$retun .= '   * @link http://code.google.com/p/cormoframework/'."\n";
			$retun .= '   * @link http://www.beetec.com.ar'."\n";
			$retun .= '   */'."\n";
			$retun .= "\n";
      $retun .= "  class Base".$this->getConfigObjectName()." extends Persist implements PersistInterface {\n\n";
			
			/**
			 * Definimos los Atributos
			 */
			foreach($this->getConfigFields() as $atributo)	{
				$retun .= "    private $".'_'.ucwords($atributo).";\n";
			}
			
			$retun .= "\n\n";
			
			/**
			 * Definimos el Costructor de la Class
			 */
			
			$retun .= '    function __construct($id = null)  {'."\n";
      $retun .= "      parent::__construct('orm_".$this->getConfigObjectName()."');\n";
      $retun .= '      if (!is_null($id)) {'."\n";
      $retun .= '        parent::find($id);'."\n";
      $retun .=	"      }\n\n";
      $retun .=	"    }\n\n";

      /**
       * Definimos los metodos que estan expresados en la Interface
       */
    	
			$retun .= '    /**'."\n";
			$retun .= '     * Guarda los cambios o crea un nuevo objeto '.ucwords($this->getConfigObjectName()).'.'."\n";
			$retun .= '     * En el caso de que el objeto ya exista, se devolvera su Key en lugar de un boolean.'."\n";
			$retun .= '     *'."\n";
			$retun .= '     * @return mixed'."\n";
			$retun .= '     */'."\n";
      $retun .= "    function save() {\n";
			$retun .= "      return parent::save();\n";
      $retun .= "    }\n\n";
    
			$retun .= '    /**'."\n";
			$retun .= '     * Busca el objeto '.ucwords($this->getConfigObjectName()).', a partir de su Key.'."\n";
			$retun .= '     *'."\n";
			$retun .= '     * @param mixed $id'."\n";
			$retun .= '     * @return boolean'."\n";
			$retun .= '     */'."\n";
      $retun .= '    function find($id) {'."\n";
			$retun .= '      return parent::find($id);'."\n";
      $retun .= "    }\n\n";
    
			$retun .= '    /**'."\n";
			$retun .= '     * A partir de los valores que posee el objeto '.ucwords($this->getConfigObjectName()).', intentara recuperar el objeto valido que posee los mismos valores. Retornando su Key y a su vez asignandoselo al objeto actual.'."\n";
			$retun .= '     *'."\n";
			$retun .= '     * @return int'."\n";
			$retun .= '     */'."\n";
      $retun .= "    function exists() {\n";
			$retun .= "      return parent::exists();\n";
      $retun .= "    }\n\n";
    
			$retun .= '    /**'."\n";
			$retun .= '     * Elimina la persistencia del objeto '.ucwords($this->getConfigObjectName()).'.'."\n";
			$retun .= '     *'."\n";
			$retun .= '     * @return boolean'."\n";
			$retun .= '     */'."\n";
      $retun .= "    function delete() {\n";
			$retun .= "      return parent::delete();\n";
      $retun .= "    }\n\n";

			/**
			 * Definimos Getters y Setter
			 */
			foreach($this->getConfigFields() as $atributo)	{
				
				// Verificamos si se trata del SET del ID que debe ser Protegido 
				if (($atributo == 'ID') || ($atributo == 'id') )	{
					$retun .= '    /**'."\n";
					$retun .= '     * Define el valor para el property Key del objeto.'."\n";
					$retun .= '     *'."\n";
					$retun .= '     * @param mixed $'.strtolower($atributo)."\n";
					$retun .= '     * @return void'."\n";
					$retun .= '     */'."\n";
					$retun .= "    protected function set".ucwords($atributo)."($".strtolower($atributo).")  {\n";
					$retun .= '      $this->_'.ucwords($atributo).' = $'.strtolower($atributo).';'."\n";
					$retun .= "    }\n\n";
				}	else	{
					// Verificamos si se trata de una relacion de objetos 1:1
					if (@in_array($atributo, $this->getSetObjects()))	{
						$retun .= '    /**'."\n";
						$retun .= '     * Define el valor para el property '.ucwords($atributo).' del objeto.'."\n";
						$retun .= '     *'."\n";
            $retun .= '     * @param mixed $'.strtolower($atributo)."\n";
						$retun .= '     * @return void'."\n";
						$retun .= '     */'."\n";
						$retun .= "    protected function set".ucwords($atributo)."($".strtolower($atributo).")  {\n";
						$retun .= '      $this->_'.ucwords($atributo).' = $'.strtolower($atributo).';'."\n";
						$retun .= "    }\n\n";
					} else	{
						$retun .= '    /**'."\n";
						$retun .= '     * Define el valor para el property '.ucwords($atributo).' del objeto.'."\n";
						$retun .= '     *'."\n";
            $retun .= '     * @param mixed $'.strtolower($atributo)."\n";
						$retun .= '     * @return void'."\n";
						$retun .= '     */'."\n";
						$retun .= "    public function set".ucwords($atributo)."($".strtolower($atributo).")  {\n";
						$retun .= '      $this->_'.ucwords($atributo).' = $'.strtolower($atributo).';'."\n";
						$retun .= "    }\n\n";
					}
				}
				
				// Verificamos si se trata de una relacion de objetos 1:1
				if (@in_array($atributo, $this->getSetObjects()))	{
					$retun .= '    /**'."\n";
					$retun .= '     * Obtiene el valor del property '.ucwords($atributo).' del objeto.'."\n";
					$retun .= '     *'."\n";
					$retun .= '     * @return mixed'."\n";
					$retun .= '     */'."\n";
					$retun .= "    protected function get".ucwords($atributo)."()  {\n";
					$retun .= '      return $this->_'.ucwords($atributo).';'."\n";
					$retun .= "    }\n\n";
				}	else	{
					$retun .= '    /**'."\n";
					$retun .= '     * Obtiene el valor del property '.ucwords($atributo).' del objeto.'."\n";
					$retun .= '     *'."\n";
					$retun .= '     * @return mixed'."\n";
					$retun .= '     */'."\n";
					$retun .= "    public function get".ucwords($atributo)."()  {\n";
					$retun .= '      return $this->_'.ucwords($atributo).';'."\n";
					$retun .= "    }\n\n";
				}
			
			}
			
			/**
			 * Cerramos la Class
			 */
			
			$retun .= "  }\n";
			
			return $retun;
		}
		
		private function getSetObjects()  {
			return $this->arrSetObjects;
		}
		
		private function setSetObjects($arrSetObjects)  {
			$this->arrSetObjects = $arrSetObjects;
		}
		
	}
	
?>